It is common today for users to store their data on both a local storage device on a local network as well as on remote devices in remote networks (e.g., cloud based storage systems). As the number of files and the total amount of data that users need to store and access increases, it is not uncommon for a user's amount of remote storage (including cloud storage) to far exceed the user's local storage capabilities. For example, a user may have 300 Gb of local storage available, but also have several terabytes of remote storage. In these situations, it is not possible for a user to have a local copy of all of the user's files.
When a user attempts to access from a local computing device a file that is stored in a remote location, but for which there is no existing local copy, the file must be transferred from the remote location to the user's local computing device. In general, to accomplish the transfer of a file comprising a plurality of data blocks, a server sequentially streams the data blocks from the remote location to a memory residing on the user's local computing device. The local computing device processes the received data blocks into a file or other media so as to enable the user to access the file. The speed at which enough of the transfer of the file can be completed to enable the local computing device to begin accessing the file is critical both to the quality of service offered by a remote storage provider and level of user satisfaction with a remote storage provider.